package muhnes.sizoo.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;  
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;
import javax.sql.DataSource;
import javax.annotation.PreDestroy;
import javax.faces.event.ComponentSystemEvent;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import muhnes.sizoo.modelo.Registro;

/**
 *
 * @author seven
 */
@ManagedBean(name = "reporteBean")
@ViewScoped
public class ReporteBean implements Serializable {

    //@Resource(name="jdbc/Sizoo")
    private DataSource fuenteJndi;
    private Result result;
    private String consulta;
    
    /**
     * Constructor de la clase
     */
    public ReporteBean() {
        
    }
    
    /**
     * Metodo que termina una conexion SQL
     * @throws SQLException 
     */
    @PreDestroy
    public void cerrarSesion() throws SQLException {
        if( !fuenteJndi.getConnection().isClosed() ) {
            fuenteJndi.getConnection().close();
        }
    }
    
    public void validarAcceso(ComponentSystemEvent evento) throws IOException {
        //boolean accesoPermitido = sesionBean.verificarPermiso("acceder", vistaProtegida); 
        
        /*if( !accesoPermitido ) {
            FacesContext contexto = FacesContext.getCurrentInstance();
            String nombreContexto = contexto.getExternalContext().getRequestContextPath();
            String urlError = nombreContexto + "/paginas/errores/error.xhtml";
            contexto.getExternalContext().redirect(urlError);
        }*/
    }
    
    /**
     * Getter de consulta
     *  
     */
    public String getConsulta() {
        return consulta;
    }
    
    /**
     * Setter de consulta
     * @param consulta 
     */
    public void setConsulta( String consulta ) {
        this.consulta = consulta;
        ejecutarConsulta();
    }
    
    /**
     * Metodo que ejecuta la consulta SQL
     */
   public void ejecutarConsulta() {
       
       try {
			Context ctx = new InitialContext();
			fuenteJndi = (DataSource)ctx.lookup("jdbc/Sizoo");
 
		//get database connection
		Connection con = fuenteJndi.getConnection();
 
		PreparedStatement ps 
			= con.prepareStatement(consulta); 
 
		//get customer data from database
		ResultSet rs =  ps.executeQuery();
                result = ResultSupport.toResult(rs);
                
                } catch (NamingException e) {
			e.printStackTrace();
		} catch (SQLException sr) {
                    sr.printStackTrace();
                }

		
	}
   
   /**
    * Metodo que obtiene los registros a mostrar
    *  
    */
   public List<Registro> getRegistros() {
       List<Registro> registros = new ArrayList<Registro>();
       
       for( int i=0; i<result.getRows().length; ++i ) {
           for( int j=0; j<result.getColumnNames().length; ++j ) {
               String columna = result.getColumnNames()[j];
               String valor = (String)result.getRows()[i].get(columna).toString();
               Registro registro = new Registro();
               registro.setColumna(columna);
               registro.setFila(String.valueOf(i+1));
               registro.setValor(valor);
               registros.add( registro );
           }
       }
       
       return registros;
   }
   
}
